﻿2026-05-17T09:29:17.3919011Z ##[group]Run pnpm verify:phase-5
2026-05-17T09:29:17.3919374Z [36;1mpnpm verify:phase-5[0m
2026-05-17T09:29:17.3952624Z shell: /usr/bin/bash -e {0}
2026-05-17T09:29:17.3953064Z env:
2026-05-17T09:29:17.3953273Z   SKIP_STAGING_VERIFY: false
2026-05-17T09:29:17.3953531Z   SKIP_PHASE_4_CARRYOVER: 
2026-05-17T09:29:17.3953770Z   SKIP_STAGING_SMOKE: false
2026-05-17T09:29:17.3954064Z   PNPM_HOME: /home/runner/setup-pnpm/node_modules/.bin
2026-05-17T09:29:17.3954392Z   SKIP_PHASE_3_CARRYOVER: 1
2026-05-17T09:29:17.3954625Z   SKIP_TRACE_CHECK: 1
2026-05-17T09:29:17.3954837Z ##[endgroup]
2026-05-17T09:29:17.6952653Z 
2026-05-17T09:29:17.6969543Z > rebno@0.0.0 verify:phase-5 /home/runner/work/rebno/rebno
2026-05-17T09:29:17.6970534Z > node scripts/verify-phase-5.mjs
2026-05-17T09:29:17.6971018Z 
2026-05-17T09:29:17.7402609Z 
2026-05-17T09:29:17.7418960Z === Phase 4 carry-over: verify-phase-4 ===
2026-05-17T09:29:17.7419813Z >>> pnpm verify:phase-4
2026-05-17T09:29:18.0788683Z 
2026-05-17T09:29:18.0789674Z > rebno@0.0.0 verify:phase-4 /home/runner/work/rebno/rebno
2026-05-17T09:29:18.0790948Z > node scripts/verify-phase-4.mjs
2026-05-17T09:29:18.0791559Z 
2026-05-17T09:29:18.1088976Z 
2026-05-17T09:29:18.1089823Z === Workspace: typecheck ===
2026-05-17T09:29:18.1090779Z >>> pnpm -r typecheck
2026-05-17T09:29:18.4212470Z Scope: 5 of 6 workspace projects
2026-05-17T09:29:18.4270256Z packages/db typecheck$ tsc --noEmit
2026-05-17T09:29:18.4279343Z packages/game-logic typecheck$ tsc --noEmit
2026-05-17T09:29:21.1725449Z packages/game-logic typecheck: Done
2026-05-17T09:29:21.1762776Z packages/protocol typecheck$ tsc --noEmit
2026-05-17T09:29:22.9773969Z packages/db typecheck: Done
2026-05-17T09:29:24.7030033Z packages/protocol typecheck: Done
2026-05-17T09:29:24.7036784Z apps/server typecheck$ tsc --noEmit
2026-05-17T09:29:24.7040052Z apps/client typecheck$ tsc --noEmit
2026-05-17T09:29:37.2641741Z apps/client typecheck: Done
2026-05-17T09:29:37.8646423Z apps/server typecheck: Done
2026-05-17T09:29:37.8744718Z 
2026-05-17T09:29:37.8745282Z === Lint: protocol-sync ===
2026-05-17T09:29:37.8746095Z >>> pnpm lint:protocol-sync
2026-05-17T09:29:38.1752991Z 
2026-05-17T09:29:38.1759686Z > rebno@0.0.0 lint:protocol-sync /home/runner/work/rebno/rebno
2026-05-17T09:29:38.1760779Z > node tools/scripts/lint-protocol-sync.mjs
2026-05-17T09:29:38.1763405Z 
2026-05-17T09:29:38.2044747Z lint-protocol-sync: OK
2026-05-17T09:29:38.2162673Z 
2026-05-17T09:29:38.2165055Z === Lint: game-logic-purity ===
2026-05-17T09:29:38.2168983Z >>> pnpm lint:game-logic-purity
2026-05-17T09:29:38.5154590Z 
2026-05-17T09:29:38.5156764Z > rebno@0.0.0 lint:game-logic-purity /home/runner/work/rebno/rebno
2026-05-17T09:29:38.5158374Z > node tools/scripts/lint-game-logic-purity.mjs
2026-05-17T09:29:38.5159021Z 
2026-05-17T09:29:38.5478977Z lint-game-logic-purity: OK (8 file(s) clean)
2026-05-17T09:29:38.5588831Z 
2026-05-17T09:29:38.5603533Z === Lint: better-auth-schema-sync ===
2026-05-17T09:29:38.5621174Z >>> pnpm lint:better-auth-schema-sync
2026-05-17T09:29:38.8781557Z 
2026-05-17T09:29:38.8785323Z > rebno@0.0.0 lint:better-auth-schema-sync /home/runner/work/rebno/rebno
2026-05-17T09:29:38.8803758Z > node tools/scripts/lint-better-auth-schema-sync.mjs
2026-05-17T09:29:38.8807217Z 
2026-05-17T09:29:40.5395564Z lint-better-auth-schema-sync: OK
2026-05-17T09:29:40.5510944Z 
2026-05-17T09:29:40.5511596Z === Lint: rate-limit-budgets ===
2026-05-17T09:29:40.5512897Z >>> pnpm lint:rate-limit-budgets
2026-05-17T09:29:40.8576742Z 
2026-05-17T09:29:40.8577670Z > rebno@0.0.0 lint:rate-limit-budgets /home/runner/work/rebno/rebno
2026-05-17T09:29:40.8578572Z > node tools/scripts/lint-rate-limit-budgets.mjs
2026-05-17T09:29:40.8579013Z 
2026-05-17T09:29:40.8873723Z lint-rate-limit-budgets: OK (5 D-22 budgets locked)
2026-05-17T09:29:40.8990945Z 
2026-05-17T09:29:40.8991560Z === Lint: no-clipboard-rce ===
2026-05-17T09:29:40.8992889Z >>> pnpm lint:no-clipboard-rce
2026-05-17T09:29:41.2013052Z 
2026-05-17T09:29:41.2014206Z > rebno@0.0.0 lint:no-clipboard-rce /home/runner/work/rebno/rebno
2026-05-17T09:29:41.2016175Z > node tools/scripts/lint-no-clipboard-rce.mjs
2026-05-17T09:29:41.2016865Z 
2026-05-17T09:29:41.2361607Z lint-no-clipboard-rce: OK (23 file(s) clean)
2026-05-17T09:29:41.2477658Z 
2026-05-17T09:29:41.2478165Z === Lint: room-layout ===
2026-05-17T09:29:41.2478930Z >>> pnpm lint:room-layout
2026-05-17T09:29:41.5483454Z 
2026-05-17T09:29:41.5484432Z > rebno@0.0.0 lint:room-layout /home/runner/work/rebno/rebno
2026-05-17T09:29:41.5485594Z > node tools/scripts/lint-room-layout.mjs
2026-05-17T09:29:41.5486261Z 
2026-05-17T09:29:41.5817185Z lint-room-layout: OK
2026-05-17T09:29:41.5936284Z 
2026-05-17T09:29:41.5936853Z === ADR 0004 lint ===
2026-05-17T09:29:41.5937591Z >>> pnpm lint:adr:0004
2026-05-17T09:29:41.8955479Z 
2026-05-17T09:29:41.8956514Z > rebno@0.0.0 lint:adr:0004 /home/runner/work/rebno/rebno
2026-05-17T09:29:41.8958128Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0004-room-hot-reload.md --no-matrix
2026-05-17T09:29:41.8959168Z 
2026-05-17T09:29:41.9259541Z OK: ADR docs/adr/0004-room-hot-reload.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-17T09:29:41.9378120Z 
2026-05-17T09:29:41.9378826Z === Drizzle: emit-check ===
2026-05-17T09:29:41.9379795Z >>> pnpm db:emit-check
2026-05-17T09:29:42.2612951Z 
2026-05-17T09:29:42.2613991Z > rebno@0.0.0 db:emit-check /home/runner/work/rebno/rebno
2026-05-17T09:29:42.2617080Z > pnpm -C packages/db exec drizzle-kit generate && node -e "require('fs').copyFileSync('packages/db/migrations/0001_baseline.sql','docs/extracted-server/0001_baseline.sql')" && git diff --exit-code packages/db/migrations/0001_baseline.sql docs/extracted-server/0001_baseline.sql
2026-05-17T09:29:42.2619436Z 
2026-05-17T09:29:42.7229689Z No config path provided, using default 'drizzle.config.ts'
2026-05-17T09:29:42.7232451Z Reading config file '/home/runner/work/rebno/rebno/packages/db/drizzle.config.ts'
2026-05-17T09:29:43.1465937Z 8 tables
2026-05-17T09:29:43.1466730Z accounts 8 columns 1 indexes 0 fks
2026-05-17T09:29:43.1467740Z audit_log 6 columns 0 indexes 2 fks
2026-05-17T09:29:43.1471237Z characters 9 columns 0 indexes 1 fks
2026-05-17T09:29:43.1472423Z inventory_items 4 columns 0 indexes 1 fks
2026-05-17T09:29:43.1473464Z legacy_credentials_staging 6 columns 0 indexes 0 fks
2026-05-17T09:29:43.1474503Z message_board_replies 5 columns 0 indexes 2 fks
2026-05-17T09:29:43.1475391Z message_board_topics 7 columns 0 indexes 1 fks
2026-05-17T09:29:43.1476148Z sessions 5 columns 0 indexes 1 fks
2026-05-17T09:29:43.1476702Z 
2026-05-17T09:29:43.1477570Z No schema changes, nothing to migrate 😴
2026-05-17T09:29:43.8048254Z 
2026-05-17T09:29:43.8049077Z === Drizzle: schema-sync ===
2026-05-17T09:29:43.8049822Z >>> pnpm lint:schema-sync
2026-05-17T09:29:44.1084340Z 
2026-05-17T09:29:44.1085430Z > rebno@0.0.0 lint:schema-sync /home/runner/work/rebno/rebno
2026-05-17T09:29:44.1089264Z > node -e "const a=require('fs').readFileSync('packages/db/migrations/0001_baseline.sql');const b=require('fs').readFileSync('docs/extracted-server/0001_baseline.sql');if(Buffer.compare(a,b)!==0){console.error('docs/extracted-server/0001_baseline.sql out of sync with packages/db/migrations/0001_baseline.sql');process.exit(1)}console.log('OK')"
2026-05-17T09:29:44.1092184Z 
2026-05-17T09:29:44.1340390Z OK
2026-05-17T09:29:44.1463697Z 
2026-05-17T09:29:44.1464456Z === Drizzle: source-comments ===
2026-05-17T09:29:44.1465228Z >>> pnpm lint:source-comments
2026-05-17T09:29:44.4502709Z 
2026-05-17T09:29:44.4503807Z > rebno@0.0.0 lint:source-comments /home/runner/work/rebno/rebno
2026-05-17T09:29:44.4505065Z > pnpm -C packages/db run lint:source-comments
2026-05-17T09:29:44.4505751Z 
2026-05-17T09:29:44.7575607Z 
2026-05-17T09:29:44.7576871Z > @rebno/db@0.1.0 lint:source-comments /home/runner/work/rebno/rebno/packages/db
2026-05-17T09:29:44.7578379Z > node scripts/check-source-comments.mjs
2026-05-17T09:29:44.7579024Z 
2026-05-17T09:29:44.7878689Z check-source-comments: OK (50 columns, all SOURCE-cited)
2026-05-17T09:29:44.8090503Z 
2026-05-17T09:29:44.8091230Z === Workspace: test ===
2026-05-17T09:29:44.8093117Z >>> pnpm -r test
2026-05-17T09:29:45.1185924Z Scope: 5 of 6 workspace projects
2026-05-17T09:29:45.1242244Z packages/db test$ vitest run
2026-05-17T09:29:45.1251365Z packages/game-logic test$ vitest run
2026-05-17T09:29:45.6154324Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-17T09:29:45.6443896Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-17T09:29:46.0634773Z packages/game-logic test:  [32m✓[39m test/step-bno-fidelity.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 28[2mms[22m[39m
2026-05-17T09:29:46.3024378Z packages/game-logic test:  [32m✓[39m test/collision-axis-slide.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-17T09:29:46.5149857Z packages/game-logic test:  [32m✓[39m test/wall-slide.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-17T09:29:46.6835927Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-17T09:29:46.7604466Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-17T09:29:46.9398888Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-17T09:29:46.9854091Z packages/game-logic test:  [32m✓[39m test/navi-mask-bbox.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-17T09:29:47.2188903Z packages/game-logic test:  [32m✓[39m test/walkable-edge.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-17T09:29:47.4348627Z packages/game-logic test:  [32m✓[39m test/movement-constants.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-17T09:29:47.6624464Z packages/game-logic test:  [32m✓[39m test/sprite-state-machine.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-17T09:29:47.7442528Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-17T09:29:47.7503585Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-17T09:29:47.7534810Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-17T09:29:47.7535775Z packages/db test: [2m   Start at [22m 09:29:45
2026-05-17T09:29:47.7537145Z packages/db test: [2m   Duration [22m 2.09s[2m (transform 198ms, setup 0ms, import 1.43s, tests 31ms, environment 1ms)[22m
2026-05-17T09:29:47.7813138Z packages/db test: Done
2026-05-17T09:29:47.7852707Z packages/protocol test$ vitest run
2026-05-17T09:29:47.9114263Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-17T09:29:48.1667502Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-17T09:29:48.2942541Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-17T09:29:48.4112661Z packages/game-logic test:  [32m✓[39m test/run-speed.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-17T09:29:48.6965310Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m25 tests[22m[2m)[22m[32m 22[2mms[22m[39m
2026-05-17T09:29:48.7163994Z packages/game-logic test:  [32m✓[39m test/step-pass-through.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-17T09:29:48.9408762Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-17T09:29:48.9493457Z packages/game-logic test: [2m Test Files [22m [1m[32m13 passed[39m[22m[90m (13)[39m
2026-05-17T09:29:48.9526089Z packages/game-logic test: [2m      Tests [22m [1m[32m63 passed[39m[22m[90m (63)[39m
2026-05-17T09:29:48.9549243Z packages/game-logic test: [2m   Start at [22m 09:29:45
2026-05-17T09:29:48.9556476Z packages/game-logic test: [2m   Duration [22m 3.32s[2m (transform 271ms, setup 0ms, import 527ms, tests 123ms, environment 4ms)[22m
2026-05-17T09:29:48.9953133Z packages/game-logic test: Done
2026-05-17T09:29:49.0114633Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 20[2mms[22m[39m
2026-05-17T09:29:49.1804995Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-17T09:29:49.3300837Z packages/protocol test:  [32m✓[39m test/anim-state.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-17T09:29:49.4839420Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-17T09:29:49.4877091Z packages/protocol test: [2m Test Files [22m [1m[32m5 passed[39m[22m[90m (5)[39m
2026-05-17T09:29:49.4895713Z packages/protocol test: [2m      Tests [22m [1m[32m59 passed[39m[22m[90m (59)[39m
2026-05-17T09:29:49.4897144Z packages/protocol test: [2m   Start at [22m 09:29:48
2026-05-17T09:29:49.4898914Z packages/protocol test: [2m   Duration [22m 1.18s[2m (transform 147ms, setup 0ms, import 314ms, tests 60ms, environment 1ms)[22m
2026-05-17T09:29:49.5208407Z packages/protocol test: Done
2026-05-17T09:29:49.5213224Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-17T09:29:49.5216868Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-17T09:29:50.0583336Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-17T09:29:50.1454200Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-17T09:29:51.3471250Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 108[2mms[22m[39m
2026-05-17T09:29:51.5736990Z apps/client test:  [32m✓[39m src/__test__/nameplate-stability.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 44[2mms[22m[39m
2026-05-17T09:29:51.8035678Z apps/server test:  [32m✓[39m test/layout-derive.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 139[2mms[22m[39m
2026-05-17T09:29:52.0618579Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 17[2mms[22m[39m
2026-05-17T09:29:52.3621831Z apps/server test:  [32m✓[39m test/static-assets.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-17T09:29:52.6385603Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 23[2mms[22m[39m
2026-05-17T09:29:53.0130719Z apps/server test: {"level":40,"time":1779010193005,"pid":3307,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-17T09:29:53.0274062Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 30[2mms[22m[39m
2026-05-17T09:29:53.0323462Z apps/server test: {"level":40,"time":1779010193013,"pid":3307,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-17T09:29:53.0371628Z apps/server test: {"level":40,"time":1779010193014,"pid":3307,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-17T09:29:53.3577037Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-17T09:29:53.3604081Z apps/client test: [22m[39mroom_layout signature did not verify — rendering anyway (defense-in-depth; see 06.1-D40-SPIKE.md) mvp-lobby 000
2026-05-17T09:29:53.4638781Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 270[2mms[22m[39m
2026-05-17T09:29:53.8908985Z apps/server test: {"level":30,"time":1779010193888,"pid":3322,"hostname":"runnervmrw5os","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-17T09:29:53.8953978Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 648[2mms[22m[39m
2026-05-17T09:29:53.8993714Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 537[2mms[22m[39m
2026-05-17T09:29:54.3055477Z apps/server test: {"level":40,"time":1779010194301,"pid":3354,"hostname":"runnervmrw5os","msg_type":"position_update","sessionId":"sid-1","issue":"[\n  {\n    \"code\": \"unrecognized_keys\",\n    \"keys\": [\n      \"account_id\"\n    ],\n    \"path\": [],\n    \"message\": \"Unrecognized key(s) in object: 'account_id'\"\n  }\n]","msg":"invalid_intent"}
2026-05-17T09:29:54.3140147Z apps/server test:  [32m✓[39m test/position-update.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 19[2mms[22m[39m
2026-05-17T09:29:54.3160155Z apps/server test: {"level":40,"time":1779010194304,"pid":3354,"hostname":"runnervmrw5os","msg_type":"position_update","account_id":"acct-1","sessionId":"sid-1","msg":"rate_limit_dropped"}
2026-05-17T09:29:54.8619208Z apps/client test:  [32m✓[39m src/__test__/sprite-state-machine.teleport-gate.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 104[2mms[22m[39m
2026-05-17T09:29:55.3064858Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-17T09:29:55.3067554Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-1he9f9/rebno.db
2026-05-17T09:29:55.3083103Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-17T09:29:55.3944910Z apps/server test: [90mstderr[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-17T09:29:55.3971141Z apps/server test: [22m[39m[run-migrations] uat-seed soft-failed (continuing): SqliteError: no such table: user
2026-05-17T09:29:55.3976636Z apps/server test:     at Database.prepare (/home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/better-sqlite3@12.9.0/node_modules/[4mbetter-sqlite3[24m/lib/methods/wrappers.js:5:21)
2026-05-17T09:29:55.3981513Z apps/server test:     at seedOne [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:62:10[90m)[39m
2026-05-17T09:29:55.3985740Z apps/server test:     at seedUatAccounts [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:108:11[90m)[39m
2026-05-17T09:29:55.3996977Z apps/server test:     at main [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/run-migrations.js:176:15[90m)[39m
2026-05-17T09:29:55.3999754Z apps/server test: [90m    at processTicksAndRejections (node:internal/process/task_queues:103:5)[39m
2026-05-17T09:29:55.4011249Z apps/server test:     at [90m/home/runner/work/rebno/rebno/apps/server/[39mtest/run-migrations.test.ts:44:18
2026-05-17T09:29:55.4017002Z apps/server test:     at file:///home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/@vitest+runner@4.1.5/node_modules/[4m@vitest/runner[24m/dist/chunk-artifact.js:1903:20 {
2026-05-17T09:29:55.4019541Z apps/server test:   code: [32m'SQLITE_ERROR'[39m
2026-05-17T09:29:55.4033039Z apps/server test: }
2026-05-17T09:29:55.4035251Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-17T09:29:55.4037860Z apps/server test: [22m[39m[run-migrations] OK
2026-05-17T09:29:55.4144665Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-17T09:29:55.4171213Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-LNkfnL/rebno.db
2026-05-17T09:29:55.4214600Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-17T09:29:55.4218481Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-17T09:29:55.4236707Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-17T09:29:55.4239662Z apps/server test: [22m[39m[run-migrations] OK
2026-05-17T09:29:55.4260669Z apps/server test: [90mstderr[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-17T09:29:55.4272403Z apps/server test: [22m[39m[run-migrations] uat-seed soft-failed (continuing): SqliteError: no such table: user
2026-05-17T09:29:55.4277879Z apps/server test:     at Database.prepare (/home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/better-sqlite3@12.9.0/node_modules/[4mbetter-sqlite3[24m/lib/methods/wrappers.js:5:21)
2026-05-17T09:29:55.4297004Z apps/server test:     at seedOne [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:62:10[90m)[39m
2026-05-17T09:29:55.4327146Z apps/server test:     at seedUatAccounts [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:108:11[90m)[39m
2026-05-17T09:29:55.4329481Z apps/server test:     at main [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/run-migrations.js:176:15[90m)[39m
2026-05-17T09:29:55.4348709Z apps/server test: [90m    at processTicksAndRejections (node:internal/process/task_queues:103:5)[39m
2026-05-17T09:29:55.4352279Z apps/server test:     at [90m/home/runner/work/rebno/rebno/apps/server/[39mtest/run-migrations.test.ts:72:18
2026-05-17T09:29:55.4357124Z apps/server test:     at file:///home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/@vitest+runner@4.1.5/node_modules/[4m@vitest/runner[24m/dist/chunk-artifact.js:1903:20 {
2026-05-17T09:29:55.4359925Z apps/server test:   code: [32m'SQLITE_ERROR'[39m
2026-05-17T09:29:55.4383200Z apps/server test: }
2026-05-17T09:29:55.4402557Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-17T09:29:55.4418870Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-TAJriH/rebno.db
2026-05-17T09:29:55.4462533Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-17T09:29:55.4465056Z apps/server test: [90mstderr[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-17T09:29:55.4467315Z apps/server test: [22m[39m[run-migrations] uat-seed soft-failed (continuing): SqliteError: no such table: user
2026-05-17T09:29:55.4480904Z apps/server test:     at Database.prepare (/home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/better-sqlite3@12.9.0/node_modules/[4mbetter-sqlite3[24m/lib/methods/wrappers.js:5:21)
2026-05-17T09:29:55.4484317Z apps/server test:     at seedOne [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:62:10[90m)[39m
2026-05-17T09:29:55.4486612Z apps/server test:     at seedUatAccounts [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:108:11[90m)[39m
2026-05-17T09:29:55.4488780Z apps/server test:     at main [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/run-migrations.js:176:15[90m)[39m
2026-05-17T09:29:55.4490670Z apps/server test: [90m    at processTicksAndRejections (node:internal/process/task_queues:103:5)[39m
2026-05-17T09:29:55.4493230Z apps/server test:     at [90m/home/runner/work/rebno/rebno/apps/server/[39mtest/run-migrations.test.ts:91:19
2026-05-17T09:29:55.4495891Z apps/server test:     at file:///home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/@vitest+runner@4.1.5/node_modules/[4m@vitest/runner[24m/dist/chunk-artifact.js:1903:20 {
2026-05-17T09:29:55.4497568Z apps/server test:   code: [32m'SQLITE_ERROR'[39m
2026-05-17T09:29:55.4498284Z apps/server test: }
2026-05-17T09:29:55.4500098Z apps/server test: [90mstderr[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-17T09:29:55.4502575Z apps/server test: [22m[39m[run-migrations] uat-seed soft-failed (continuing): SqliteError: no such table: user
2026-05-17T09:29:55.4505029Z apps/server test:     at Database.prepare (/home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/better-sqlite3@12.9.0/node_modules/[4mbetter-sqlite3[24m/lib/methods/wrappers.js:5:21)
2026-05-17T09:29:55.4507479Z apps/server test:     at seedOne [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:62:10[90m)[39m
2026-05-17T09:29:55.4509697Z apps/server test:     at seedUatAccounts [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:108:11[90m)[39m
2026-05-17T09:29:55.4511627Z apps/server test:     at main [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/run-migrations.js:176:15[90m)[39m
2026-05-17T09:29:55.4514033Z apps/server test: [90m    at processTicksAndRejections (node:internal/process/task_queues:103:5)[39m
2026-05-17T09:29:55.4515767Z apps/server test:     at [90m/home/runner/work/rebno/rebno/apps/server/[39mtest/run-migrations.test.ts:93:20
2026-05-17T09:29:55.4518100Z apps/server test:     at file:///home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/@vitest+runner@4.1.5/node_modules/[4m@vitest/runner[24m/dist/chunk-artifact.js:1903:20 {
2026-05-17T09:29:55.4519748Z apps/server test:   code: [32m'SQLITE_ERROR'[39m
2026-05-17T09:29:55.4520471Z apps/server test: }
2026-05-17T09:29:55.4522871Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-17T09:29:55.4524669Z apps/server test: [22m[39m[run-migrations] OK
2026-05-17T09:29:55.4526706Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-17T09:29:55.4528732Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-TAJriH/rebno.db
2026-05-17T09:29:55.4530293Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-17T09:29:55.4532962Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-17T09:29:55.4534693Z apps/server test: [22m[39m[run-migrations] OK
2026-05-17T09:29:55.4536437Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 171[2mms[22m[39m
2026-05-17T09:29:55.7378209Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 20[2mms[22m[39m
2026-05-17T09:29:55.9811436Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-17T09:29:56.0841656Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 67[2mms[22m[39m
2026-05-17T09:29:56.2675220Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 26[2mms[22m[39m
2026-05-17T09:29:56.6278383Z apps/server test: {"level":40,"time":1779010196619,"pid":3437,"hostname":"runnervmrw5os","msg_type":"set_sprite_override","sessionId":"sid-1","issue":"[\n  {\n    \"received\": \"admin_form\",\n    \"code\": \"invalid_enum_value\",\n    \"options\": [\n      \"hexport_in\",\n      \"hexport_out\",\n      \"tele_in\",\n      \"tele_out\",\n      \"ncol_1\",\n      \"ncol_2\",\n      \"ncol_3\",\n      \"ncol_4\",\n      \"jokershell\",\n      \"watching\",\n      \"none\"\n    ],\n    \"path\": [\n      \"sprite_id\"\n    ],\n    \"message\": \"Invalid enum value. Expected 'hexport_in' | 'hexport_out' | 'tele_in' | 'tele_out' | 'ncol_1' | 'ncol_2' | 'ncol_3' | 'ncol_4' | 'jokershell' | 'watching' | 'none', received 'admin_form'\"\n  }\n]","msg":"invalid_intent"}
2026-05-17T09:29:56.6321475Z apps/server test:  [32m✓[39m test/sprite-override.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-17T09:29:56.6394400Z apps/server test: {"level":40,"time":1779010196621,"pid":3437,"hostname":"runnervmrw5os","msg_type":"set_sprite_override","account_id":"acct-1","sessionId":"sid-1","msg":"rate_limit_dropped"}
2026-05-17T09:29:56.8658141Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-17T09:29:57.3425331Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 19[2mms[22m[39m
2026-05-17T09:29:57.7292440Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-17T09:29:57.7351391Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ⌁ auth for agents [www.vestauth.com]
2026-05-17T09:29:57.7363490Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-17T09:29:58.4511371Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-17T09:29:58.4603224Z apps/server test: [2m Test Files [22m [1m[32m15 passed[39m[22m[90m (15)[39m
2026-05-17T09:29:58.4623184Z apps/server test: [2m      Tests [22m [1m[32m85 passed[39m[22m[90m (85)[39m
2026-05-17T09:29:58.4650560Z apps/server test: [2m   Start at [22m 09:29:50
2026-05-17T09:29:58.4674478Z apps/server test: [2m   Duration [22m 8.38s[2m (transform 644ms, setup 0ms, import 3.91s, tests 1.25s, environment 3ms)[22m
2026-05-17T09:29:58.4970275Z apps/server test: Done
2026-05-17T09:29:58.5771679Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 129[2mms[22m[39m
2026-05-17T09:29:59.2509120Z apps/client test:  [32m✓[39m src/__test__/sprite-state-machine.test.ts [2m([22m[2m29 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-17T09:29:59.9311841Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-17T09:30:00.7415009Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m16 tests[22m[2m)[22m[32m 74[2mms[22m[39m
2026-05-17T09:30:01.4878976Z apps/client test:  [32m✓[39m src/__test__/esc-menu.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 85[2mms[22m[39m
2026-05-17T09:30:02.1856786Z apps/client test:  [32m✓[39m src/__test__/player-renderer.teleport.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-17T09:30:02.8672196Z apps/client test:  [32m✓[39m src/__test__/player-renderer-spawn-delay.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 20[2mms[22m[39m
2026-05-17T09:30:03.5533235Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-17T09:30:04.2418089Z apps/client test:  [32m✓[39m src/__test__/nameplate-color.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 32[2mms[22m[39m
2026-05-17T09:30:04.9763849Z apps/client test: [90mstderr[2m | src/__test__/background-renderer.test.ts[2m > [22m[2mBackgroundRenderer — wrap math (sim-tick pure state)[2m > [22m[2mD-64 round-4: dispose() survives a group whose .clear() throws (scene-shutdown race)
2026-05-17T09:30:04.9770129Z apps/client test: [22m[39mBackgroundRenderer.dispose: group.clear threw (likely scene-shutdown race) Cannot read properties of undefined (reading 'size')
2026-05-17T09:30:04.9784666Z apps/client test:  [32m✓[39m src/__test__/background-renderer.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 93[2mms[22m[39m
2026-05-17T09:30:05.6374154Z apps/client test:  [32m✓[39m src/__test__/room-renderer.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-17T09:30:06.3590561Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 72[2mms[22m[39m
2026-05-17T09:30:07.0241283Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-17T09:30:07.6836669Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-17T09:30:08.3769958Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-17T09:30:09.0586192Z apps/client test:  [32m✓[39m src/__test__/position-dispatcher.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-17T09:30:09.7276455Z apps/client test:  [32m✓[39m src/__test__/sprite-state-rate.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-17T09:30:10.3891534Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-17T09:30:11.0370061Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher-shift.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-17T09:30:11.6913826Z apps/client test:  [32m✓[39m src/__test__/canvas-rect-tracker.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-17T09:30:12.3660954Z apps/client test:  [32m✓[39m src/__test__/boot-font-gate.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-17T09:30:13.0189366Z apps/client test:  [32m✓[39m src/__test__/legacy-origin.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-17T09:30:13.7780392Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-17T09:30:14.4374586Z apps/client test:  [32m✓[39m src/__test__/room-collision-bottom-edge.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-17T09:30:15.0857640Z apps/client test:  [32m✓[39m src/__test__/depth-set.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 3[2mms[22m[39m
2026-05-17T09:30:15.7453218Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-17T09:30:16.3994764Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-17T09:30:17.0503463Z apps/client test:  [32m✓[39m src/__test__/integer-zoom.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-17T09:30:17.7200998Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-17T09:30:17.7424632Z apps/client test: [2m Test Files [22m [1m[32m34 passed[39m[22m[90m (34)[39m
2026-05-17T09:30:17.7434111Z apps/client test: [2m      Tests [22m [1m[32m247 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (251)[39m
2026-05-17T09:30:17.7453088Z apps/client test: [2m   Start at [22m 09:29:50
2026-05-17T09:30:17.7506377Z apps/client test: [2m   Duration [22m 27.59s[2m (transform 944ms, setup 70ms, collect 1.90s, tests 1.17s, environment 15.94s, prepare 3.13s)[22m
2026-05-17T09:30:17.8782247Z apps/client test: Done
2026-05-17T09:30:17.8862967Z 
2026-05-17T09:30:17.8863568Z verify-phase-4: OK (12 steps green)
2026-05-17T09:30:17.8978853Z 
2026-05-17T09:30:17.8979401Z === Workspace: typecheck ===
2026-05-17T09:30:17.8980109Z >>> pnpm -r typecheck
2026-05-17T09:30:18.2059015Z Scope: 5 of 6 workspace projects
2026-05-17T09:30:18.2114385Z packages/db typecheck$ tsc --noEmit
2026-05-17T09:30:18.2122365Z packages/game-logic typecheck$ tsc --noEmit
2026-05-17T09:30:20.6933109Z packages/game-logic typecheck: Done
2026-05-17T09:30:20.6972626Z packages/protocol typecheck$ tsc --noEmit
2026-05-17T09:30:23.0133930Z packages/db typecheck: Done
2026-05-17T09:30:24.4330261Z packages/protocol typecheck: Done
2026-05-17T09:30:24.4337656Z apps/client typecheck$ tsc --noEmit
2026-05-17T09:30:24.4340903Z apps/server typecheck$ tsc --noEmit
2026-05-17T09:30:36.7286653Z apps/client typecheck: Done
2026-05-17T09:30:37.5475895Z apps/server typecheck: Done
2026-05-17T09:30:37.5564817Z 
2026-05-17T09:30:37.5565296Z === Lint: deploy-stack ===
2026-05-17T09:30:37.5565943Z >>> pnpm lint:deploy-stack
2026-05-17T09:30:37.8569801Z 
2026-05-17T09:30:37.8570784Z > rebno@0.0.0 lint:deploy-stack /home/runner/work/rebno/rebno
2026-05-17T09:30:37.8571797Z > node tools/scripts/lint-deploy-stack.mjs
2026-05-17T09:30:37.8572668Z 
2026-05-17T09:30:37.8868983Z lint-deploy-stack: OK
2026-05-17T09:30:37.8986851Z 
2026-05-17T09:30:37.8987473Z === Lint: deploy-stack test ===
2026-05-17T09:30:37.8988189Z >>> pnpm lint:deploy-stack:test
2026-05-17T09:30:38.2013428Z 
2026-05-17T09:30:38.2014464Z > rebno@0.0.0 lint:deploy-stack:test /home/runner/work/rebno/rebno
2026-05-17T09:30:38.2015534Z > node tools/scripts/lint-deploy-stack.test.mjs
2026-05-17T09:30:38.2016100Z 
2026-05-17T09:30:38.2619804Z PASS: lint-deploy-stack green
2026-05-17T09:30:38.2744795Z 
2026-05-17T09:30:38.2745557Z === ADR 0005 lint ===
2026-05-17T09:30:38.2746206Z >>> pnpm lint:adr:0005
2026-05-17T09:30:38.5746252Z 
2026-05-17T09:30:38.5747293Z > rebno@0.0.0 lint:adr:0005 /home/runner/work/rebno/rebno
2026-05-17T09:30:38.5749020Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0005-deploy-topology.md --no-matrix
2026-05-17T09:30:38.5750002Z 
2026-05-17T09:30:38.6042969Z OK: ADR docs/adr/0005-deploy-topology.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-17T09:30:38.6165128Z 
2026-05-17T09:30:38.6165810Z === ADR 0006 lint ===
2026-05-17T09:30:38.6166608Z >>> pnpm lint:adr:0006
2026-05-17T09:30:38.9174680Z 
2026-05-17T09:30:38.9175703Z > rebno@0.0.0 lint:adr:0006 /home/runner/work/rebno/rebno
2026-05-17T09:30:38.9177384Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0006-observability-stack.md --no-matrix
2026-05-17T09:30:38.9178320Z 
2026-05-17T09:30:38.9488718Z OK: ADR docs/adr/0006-observability-stack.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-17T09:30:38.9601473Z 
2026-05-17T09:30:38.9602246Z === Workspace: test ===
2026-05-17T09:30:38.9603099Z >>> pnpm -r test
2026-05-17T09:30:39.2692696Z Scope: 5 of 6 workspace projects
2026-05-17T09:30:39.2748132Z packages/db test$ vitest run
2026-05-17T09:30:39.2757189Z packages/game-logic test$ vitest run
2026-05-17T09:30:39.7847308Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-17T09:30:39.7863738Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-17T09:30:40.2273948Z packages/game-logic test:  [32m✓[39m test/step-bno-fidelity.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-17T09:30:40.4564650Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-17T09:30:40.7008541Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-17T09:30:40.7635214Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-17T09:30:40.9368556Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-17T09:30:41.1659403Z packages/game-logic test:  [32m✓[39m test/collision-axis-slide.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-17T09:30:41.3803418Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-17T09:30:41.5990904Z packages/game-logic test:  [32m✓[39m test/step-pass-through.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-17T09:30:41.6389482Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-17T09:30:41.8204533Z packages/game-logic test:  [32m✓[39m test/movement-constants.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-17T09:30:41.8828824Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-17T09:30:41.8913388Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-17T09:30:41.8943824Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-17T09:30:41.8968008Z packages/db test: [2m   Start at [22m 09:30:39
2026-05-17T09:30:41.8988221Z packages/db test: [2m   Duration [22m 2.10s[2m (transform 161ms, setup 0ms, import 1.46s, tests 30ms, environment 1ms)[22m
2026-05-17T09:30:41.9223064Z packages/db test: Done
2026-05-17T09:30:41.9229596Z packages/protocol test$ vitest run
2026-05-17T09:30:42.0485523Z packages/game-logic test:  [32m✓[39m test/sprite-state-machine.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-17T09:30:42.2984868Z packages/game-logic test:  [32m✓[39m test/navi-mask-bbox.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-17T09:30:42.4608759Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-17T09:30:42.5208982Z packages/game-logic test:  [32m✓[39m test/run-speed.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-17T09:30:42.7690609Z packages/game-logic test:  [32m✓[39m test/walkable-edge.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-17T09:30:42.9134174Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m25 tests[22m[2m)[22m[32m 22[2mms[22m[39m
2026-05-17T09:30:43.0119312Z packages/game-logic test:  [32m✓[39m test/wall-slide.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-17T09:30:43.0183514Z packages/game-logic test: [2m Test Files [22m [1m[32m13 passed[39m[22m[90m (13)[39m
2026-05-17T09:30:43.0203154Z packages/game-logic test: [2m      Tests [22m [1m[32m63 passed[39m[22m[90m (63)[39m
2026-05-17T09:30:43.0218791Z packages/game-logic test: [2m   Start at [22m 09:30:39
2026-05-17T09:30:43.0229441Z packages/game-logic test: [2m   Duration [22m 3.22s[2m (transform 298ms, setup 0ms, import 567ms, tests 113ms, environment 2ms)[22m
2026-05-17T09:30:43.0523511Z packages/game-logic test: Done
2026-05-17T09:30:43.1726297Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-17T09:30:43.3201296Z packages/protocol test:  [32m✓[39m test/anim-state.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-17T09:30:43.4830491Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-17T09:30:43.6331381Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-17T09:30:43.6366527Z packages/protocol test: [2m Test Files [22m [1m[32m5 passed[39m[22m[90m (5)[39m
2026-05-17T09:30:43.6368412Z packages/protocol test: [2m      Tests [22m [1m[32m59 passed[39m[22m[90m (59)[39m
2026-05-17T09:30:43.6369936Z packages/protocol test: [2m   Start at [22m 09:30:42
2026-05-17T09:30:43.6371784Z packages/protocol test: [2m   Duration [22m 1.17s[2m (transform 180ms, setup 0ms, import 325ms, tests 54ms, environment 1ms)[22m
2026-05-17T09:30:43.6702643Z packages/protocol test: Done
2026-05-17T09:30:43.6707770Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-17T09:30:43.6710539Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-17T09:30:44.2147891Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-17T09:30:44.2794019Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-17T09:30:45.2644229Z apps/server test: {"level":30,"time":1779010245261,"pid":4575,"hostname":"runnervmrw5os","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-17T09:30:45.2723507Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 750[2mms[22m[39m
2026-05-17T09:30:45.2725684Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 596[2mms[22m[39m
2026-05-17T09:30:46.2729676Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-17T09:30:46.2753227Z apps/client test: [22m[39mroom_layout signature did not verify — rendering anyway (defense-in-depth; see 06.1-D40-SPIKE.md) mvp-lobby 000
2026-05-17T09:30:46.3796352Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 267[2mms[22m[39m
2026-05-17T09:30:46.3872308Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-17T09:30:46.3886158Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-R1wjhO/rebno.db
2026-05-17T09:30:46.3890108Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-17T09:30:46.4976527Z apps/server test: [90mstderr[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-17T09:30:46.5007480Z apps/server test: [22m[39m[run-migrations] uat-seed soft-failed (continuing): SqliteError: no such table: user
2026-05-17T09:30:46.5034301Z apps/server test:     at Database.prepare (/home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/better-sqlite3@12.9.0/node_modules/[4mbetter-sqlite3[24m/lib/methods/wrappers.js:5:21)
2026-05-17T09:30:46.5062259Z apps/server test:     at seedOne [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:62:10[90m)[39m
2026-05-17T09:30:46.5088333Z apps/server test:     at seedUatAccounts [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:108:11[90m)[39m
2026-05-17T09:30:46.5123844Z apps/server test:     at main [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/run-migrations.js:176:15[90m)[39m
2026-05-17T09:30:46.5146344Z apps/server test: [90m    at processTicksAndRejections (node:internal/process/task_queues:103:5)[39m
2026-05-17T09:30:46.5205653Z apps/server test:     at [90m/home/runner/work/rebno/rebno/apps/server/[39mtest/run-migrations.test.ts:44:18
2026-05-17T09:30:46.5243919Z apps/server test:     at file:///home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/@vitest+runner@4.1.5/node_modules/[4m@vitest/runner[24m/dist/chunk-artifact.js:1903:20 {
2026-05-17T09:30:46.5259426Z apps/server test:   code: [32m'SQLITE_ERROR'[39m
2026-05-17T09:30:46.5261366Z apps/server test: }
2026-05-17T09:30:46.5265552Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-17T09:30:46.5268214Z apps/server test: [22m[39m[run-migrations] OK
2026-05-17T09:30:46.5313508Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-17T09:30:46.5315925Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-6z8kCe/rebno.db
2026-05-17T09:30:46.5317329Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-17T09:30:46.5319146Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-17T09:30:46.5321744Z apps/server test: [90mstderr[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-17T09:30:46.5344228Z apps/server test: [22m[39m[run-migrations] uat-seed soft-failed (continuing): SqliteError: no such table: user
2026-05-17T09:30:46.5346705Z apps/server test:     at Database.prepare (/home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/better-sqlite3@12.9.0/node_modules/[4mbetter-sqlite3[24m/lib/methods/wrappers.js:5:21)
2026-05-17T09:30:46.5349043Z apps/server test:     at seedOne [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:62:10[90m)[39m
2026-05-17T09:30:46.5351072Z apps/server test:     at seedUatAccounts [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:108:11[90m)[39m
2026-05-17T09:30:46.5386080Z apps/server test:     at main [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/run-migrations.js:176:15[90m)[39m
2026-05-17T09:30:46.5387846Z apps/server test: [90m    at processTicksAndRejections (node:internal/process/task_queues:103:5)[39m
2026-05-17T09:30:46.5389612Z apps/server test:     at [90m/home/runner/work/rebno/rebno/apps/server/[39mtest/run-migrations.test.ts:72:18
2026-05-17T09:30:46.5392190Z apps/server test:     at file:///home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/@vitest+runner@4.1.5/node_modules/[4m@vitest/runner[24m/dist/chunk-artifact.js:1903:20 {
2026-05-17T09:30:46.5393781Z apps/server test:   code: [32m'SQLITE_ERROR'[39m
2026-05-17T09:30:46.5394344Z apps/server test: }
2026-05-17T09:30:46.5396317Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-17T09:30:46.5398101Z apps/server test: [22m[39m[run-migrations] OK
2026-05-17T09:30:46.5400050Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-17T09:30:46.5402422Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-RNYsxp/rebno.db
2026-05-17T09:30:46.5403882Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-17T09:30:46.5454343Z apps/server test: [90mstderr[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-17T09:30:46.5463613Z apps/server test: [22m[39m[run-migrations] uat-seed soft-failed (continuing): SqliteError: no such table: user
2026-05-17T09:30:46.5504035Z apps/server test:     at Database.prepare (/home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/better-sqlite3@12.9.0/node_modules/[4mbetter-sqlite3[24m/lib/methods/wrappers.js:5:21)
2026-05-17T09:30:46.5522725Z apps/server test:     at seedOne [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:62:10[90m)[39m
2026-05-17T09:30:46.5526050Z apps/server test:     at seedUatAccounts [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:108:11[90m)[39m
2026-05-17T09:30:46.5529267Z apps/server test:     at main [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/run-migrations.js:176:15[90m)[39m
2026-05-17T09:30:46.5532154Z apps/server test: [90m    at processTicksAndRejections (node:internal/process/task_queues:103:5)[39m
2026-05-17T09:30:46.5534847Z apps/server test:     at [90m/home/runner/work/rebno/rebno/apps/server/[39mtest/run-migrations.test.ts:91:19
2026-05-17T09:30:46.5537422Z apps/server test:     at file:///home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/@vitest+runner@4.1.5/node_modules/[4m@vitest/runner[24m/dist/chunk-artifact.js:1903:20 {
2026-05-17T09:30:46.5539260Z apps/server test:   code: [32m'SQLITE_ERROR'[39m
2026-05-17T09:30:46.5540049Z apps/server test: }
2026-05-17T09:30:46.5542319Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-17T09:30:46.5544024Z apps/server test: [22m[39m[run-migrations] OK
2026-05-17T09:30:46.5546099Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-17T09:30:46.5548271Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-RNYsxp/rebno.db
2026-05-17T09:30:46.5549875Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-17T09:30:46.5552662Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-17T09:30:46.5554477Z apps/server test: [22m[39m[run-migrations] OK
2026-05-17T09:30:46.5556629Z apps/server test: [90mstderr[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-17T09:30:46.5559001Z apps/server test: [22m[39m[run-migrations] uat-seed soft-failed (continuing): SqliteError: no such table: user
2026-05-17T09:30:46.5561798Z apps/server test:     at Database.prepare (/home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/better-sqlite3@12.9.0/node_modules/[4mbetter-sqlite3[24m/lib/methods/wrappers.js:5:21)
2026-05-17T09:30:46.5564972Z apps/server test:     at seedOne [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:62:10[90m)[39m
2026-05-17T09:30:46.5567260Z apps/server test:     at seedUatAccounts [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/seed-uat-accounts.js:108:11[90m)[39m
2026-05-17T09:30:46.5569527Z apps/server test:     at main [90m(/home/runner/work/rebno/rebno/apps/server/[39mscripts/run-migrations.js:176:15[90m)[39m
2026-05-17T09:30:46.5571507Z apps/server test: [90m    at processTicksAndRejections (node:internal/process/task_queues:103:5)[39m
2026-05-17T09:30:46.5573769Z apps/server test:     at [90m/home/runner/work/rebno/rebno/apps/server/[39mtest/run-migrations.test.ts:93:20
2026-05-17T09:30:46.5576345Z apps/server test:     at file:///home/runner/work/rebno/rebno/node_modules/[4m.pnpm[24m/@vitest+runner@4.1.5/node_modules/[4m@vitest/runner[24m/dist/chunk-artifact.js:1903:20 {
2026-05-17T09:30:46.5578188Z apps/server test:   code: [32m'SQLITE_ERROR'[39m
2026-05-17T09:30:46.5578977Z apps/server test: }
2026-05-17T09:30:46.5613468Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 191[2mms[22m[39m
2026-05-17T09:30:46.9553384Z apps/server test:  [32m✓[39m test/layout-derive.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 120[2mms[22m[39m
2026-05-17T09:30:47.6156619Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 154[2mms[22m[39m
2026-05-17T09:30:48.0333983Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 67[2mms[22m[39m
2026-05-17T09:30:48.3248313Z apps/server test: {"level":40,"time":1779010248321,"pid":4678,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-17T09:30:48.3310425Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 17[2mms[22m[39m
2026-05-17T09:30:48.3333331Z apps/server test: {"level":40,"time":1779010248325,"pid":4678,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-17T09:30:48.3353293Z apps/server test: {"level":40,"time":1779010248325,"pid":4678,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-17T09:30:48.5958257Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-17T09:30:48.8557756Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 23[2mms[22m[39m
2026-05-17T09:30:48.8834236Z apps/client test:  [32m✓[39m src/__test__/sprite-state-machine.teleport-gate.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 112[2mms[22m[39m
2026-05-17T09:30:49.1354875Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 18[2mms[22m[39m
2026-05-17T09:30:49.5581645Z apps/server test: {"level":40,"time":1779010249554,"pid":4734,"hostname":"runnervmrw5os","msg_type":"position_update","sessionId":"sid-1","issue":"[\n  {\n    \"code\": \"unrecognized_keys\",\n    \"keys\": [\n      \"account_id\"\n    ],\n    \"path\": [],\n    \"message\": \"Unrecognized key(s) in object: 'account_id'\"\n  }\n]","msg":"invalid_intent"}
2026-05-17T09:30:49.5623790Z apps/server test:  [32m✓[39m test/position-update.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 23[2mms[22m[39m
2026-05-17T09:30:49.5708231Z apps/server test: {"level":40,"time":1779010249555,"pid":4734,"hostname":"runnervmrw5os","msg_type":"position_update","account_id":"acct-1","sessionId":"sid-1","msg":"rate_limit_dropped"}
2026-05-17T09:30:49.8178265Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-17T09:30:50.0731774Z apps/client test: [90mstderr[2m | src/__test__/background-renderer.test.ts[2m > [22m[2mBackgroundRenderer — wrap math (sim-tick pure state)[2m > [22m[2mD-64 round-4: dispose() survives a group whose .clear() throws (scene-shutdown race)
2026-05-17T09:30:50.0746945Z apps/client test: [22m[39mBackgroundRenderer.dispose: group.clear threw (likely scene-shutdown race) Cannot read properties of undefined (reading 'size')
2026-05-17T09:30:50.0791670Z apps/client test:  [32m✓[39m src/__test__/background-renderer.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 166[2mms[22m[39m
2026-05-17T09:30:50.1044270Z apps/server test:  [32m✓[39m test/static-assets.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-17T09:30:50.4991684Z apps/server test: {"level":40,"time":1779010250497,"pid":4759,"hostname":"runnervmrw5os","msg_type":"set_sprite_override","sessionId":"sid-1","issue":"[\n  {\n    \"received\": \"admin_form\",\n    \"code\": \"invalid_enum_value\",\n    \"options\": [\n      \"hexport_in\",\n      \"hexport_out\",\n      \"tele_in\",\n      \"tele_out\",\n      \"ncol_1\",\n      \"ncol_2\",\n      \"ncol_3\",\n      \"ncol_4\",\n      \"jokershell\",\n      \"watching\",\n      \"none\"\n    ],\n    \"path\": [\n      \"sprite_id\"\n    ],\n    \"message\": \"Invalid enum value. Expected 'hexport_in' | 'hexport_out' | 'tele_in' | 'tele_out' | 'ncol_1' | 'ncol_2' | 'ncol_3' | 'ncol_4' | 'jokershell' | 'watching' | 'none', received 'admin_form'\"\n  }\n]","msg":"invalid_intent"}
2026-05-17T09:30:50.5060109Z apps/server test:  [32m✓[39m test/sprite-override.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 26[2mms[22m[39m
2026-05-17T09:30:50.5084003Z apps/server test: {"level":40,"time":1779010250500,"pid":4759,"hostname":"runnervmrw5os","msg_type":"set_sprite_override","account_id":"acct-1","sessionId":"sid-1","msg":"rate_limit_dropped"}
2026-05-17T09:30:50.7384135Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-17T09:30:51.3814253Z apps/client test:  [32m✓[39m src/__test__/esc-menu.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 196[2mms[22m[39m
2026-05-17T09:30:51.5426820Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-17T09:30:51.5445106Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ◈ secrets for agents [www.dotenvx.com]
2026-05-17T09:30:51.5463087Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-17T09:30:52.2878294Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-17T09:30:52.5495171Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-17T09:30:52.5569938Z apps/server test: [2m Test Files [22m [1m[32m15 passed[39m[22m[90m (15)[39m
2026-05-17T09:30:52.5591169Z apps/server test: [2m      Tests [22m [1m[32m85 passed[39m[22m[90m (85)[39m
2026-05-17T09:30:52.5592833Z apps/server test: [2m   Start at [22m 09:30:44
2026-05-17T09:30:52.5608450Z apps/server test: [2m   Duration [22m 8.32s[2m (transform 594ms, setup 0ms, import 3.90s, tests 1.30s, environment 3ms)[22m
2026-05-17T09:30:52.6100001Z apps/server test: Done
2026-05-17T09:30:52.6293144Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m16 tests[22m[2m)[22m[32m 101[2mms[22m[39m
2026-05-17T09:30:53.3505781Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 74[2mms[22m[39m
2026-05-17T09:30:54.0590461Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 40[2mms[22m[39m
2026-05-17T09:30:54.7488802Z apps/client test:  [32m✓[39m src/__test__/nameplate-stability.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 24[2mms[22m[39m
2026-05-17T09:30:55.4504001Z apps/client test:  [32m✓[39m src/__test__/nameplate-color.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 32[2mms[22m[39m
2026-05-17T09:30:56.1331391Z apps/client test:  [32m✓[39m src/__test__/player-renderer-spawn-delay.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 20[2mms[22m[39m
2026-05-17T09:30:56.8477388Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-17T09:30:57.5382459Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 17[2mms[22m[39m
2026-05-17T09:30:58.2301045Z apps/client test:  [32m✓[39m src/__test__/player-renderer.teleport.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-17T09:30:58.8859900Z apps/client test:  [32m✓[39m src/__test__/canvas-rect-tracker.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-17T09:30:59.5527976Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-17T09:31:00.2048991Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-17T09:31:00.8638356Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-17T09:31:01.5408745Z apps/client test:  [32m✓[39m src/__test__/position-dispatcher.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-17T09:31:02.1956049Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher-shift.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-17T09:31:02.8500129Z apps/client test:  [32m✓[39m src/__test__/boot-font-gate.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-17T09:31:03.5165915Z apps/client test:  [32m✓[39m src/__test__/sprite-state-machine.test.ts [2m([22m[2m29 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-17T09:31:04.2199856Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-17T09:31:04.9730554Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-17T09:31:05.6312180Z apps/client test:  [32m✓[39m src/__test__/room-collision-bottom-edge.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-17T09:31:06.2990597Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-17T09:31:06.9675559Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-17T09:31:07.6262973Z apps/client test:  [32m✓[39m src/__test__/room-renderer.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-17T09:31:08.2924238Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-17T09:31:08.9757287Z apps/client test:  [32m✓[39m src/__test__/sprite-state-rate.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-17T09:31:09.6608627Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 6[2mms[22m[39m
2026-05-17T09:31:10.3304841Z apps/client test:  [32m✓[39m src/__test__/legacy-origin.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-17T09:31:10.9813920Z apps/client test:  [32m✓[39m src/__test__/integer-zoom.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-17T09:31:11.6359034Z apps/client test:  [32m✓[39m src/__test__/depth-set.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 3[2mms[22m[39m
2026-05-17T09:31:11.6592703Z apps/client test: [2m Test Files [22m [1m[32m34 passed[39m[22m[90m (34)[39m
2026-05-17T09:31:11.6594551Z apps/client test: [2m      Tests [22m [1m[32m247 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (251)[39m
2026-05-17T09:31:11.6596326Z apps/client test: [2m   Start at [22m 09:30:44
2026-05-17T09:31:11.6605851Z apps/client test: [2m   Duration [22m 27.38s[2m (transform 1.00s, setup 76ms, collect 1.93s, tests 1.37s, environment 15.69s, prepare 3.05s)[22m
2026-05-17T09:31:11.7895288Z apps/client test: Done
2026-05-17T09:31:11.7964545Z 
2026-05-17T09:31:11.7965117Z verify-phase-5: OK (7 steps green)
